<?php

//获取微信用户信息操作
namespace utils\wechat;
use EasyWeChat\Factory;
use think\facade\Log;

class UserService
{

	/**
	 * 获取用户信息
	 * @param  string $redirect_url  授权成功后重定向的url
	 * @param  array $data  授权成功后带的参数 主要是获取code
	 * @param  string $snsapi  授权类型 snsapi_userinfo 普通授权 能获取到用户信息 snsapi_base 静默授权 无法获取用户信息
	 * @return array   返回用户信息
	 */

	public static function getUserInfo($redirect_url,$data,$snsapi='snsapi_userinfo')
    {
		$app = Factory::officialAccount(config('wechat.default.official_account'));
        $oauth = $app->oauth;
        if(!isset($data['code'])){
            $targetUrl = $oauth->scopes([$snsapi])->redirect($redirect_url);
            header('Location: ' . $targetUrl);
            exit;
        }else{
            $user = $oauth->userFromCode($data['code']);
            Log::info('微信授权返回用户信息：' . print_r($user->toArray(), true));
            return $user->toArray();
        }
	}

	/**
	 * 获取用户openid信息
	 * @param  string $redirect_url  授权成功后重定向的url
	 * @param  string $data  授权成功后带的参数 主要是获取code
	 * @param  string $snsapi  授权类型 snsapi_userinfo 普通授权 能获取到用户信息 snsapi_base 静默授权
	 */
	public static function getOpenId($code){
		$app = Factory::miniProgram(config('wechat.default.mini_program'));
		$res = $app->auth->session($code);
		return $res;
	}


	/**
	 * 获取小程序用户信息
	 * @description 小程序传入 code、iv、encryptedData  先通过code获取 session_key  然后在解码出用户信息
	 */
	public static function getXcxUserInfo($data){

		if(empty($data['code'])) throw new \Exception('code不能为空');
		if(empty($data['iv'])) throw new \Exception('iv不能为空');
		if(empty($data['encryptedData'])) throw new \Exception('encryptedData不能为空');

		$app = Factory::miniProgram(config('wechat.default.mini_program'));
		try{
			$session = self::getOpenId($data['code']);	//通过code获取 session信息
            \think\facade\Log::record('UserService.getXcxUserInfo:','info');
            \think\facade\Log::record($session,'info');
			//解码用户信息
			$decryptedData = $app->encryptor->decryptData($session['session_key'],$data['iv'],$data['encryptedData']);
            $decryptedData['openid'] = $session['openid'];
		}catch(\Exception $e){
			log::error('小程序获取信息失败:'.print_r($e->getMessage(),true));
		}

		return $decryptedData;
	}



}
